/* $Id: atable.h,v 1.2 2006-10-23 17:13:52 nicolasw Exp $ */

/* Tabla hash para direcciones de memoria. Escrito por Rafael Carrascosa para la catedra de
 * Sistemas Operativos, FaMAF, UNC.
 * Eres libre de modificar,utilizar y distribuir este codigo para cualquier 
 * fin siempre y cuando mantengas la autoria.
 */

#ifndef __ATABLE_H
#define __ATABLE_H

#include <stddef.h>

/*
 * Tabla hash para adresses. Una tabla hash es una implementacion de
 * una funcion con dominio finito sobre elementos que pueden ser de
 * dificil indexacion en un arreglo comun.
 * Tambien puede pensarse como un arreglo que usa indices que pueden
 * no ser numeros enteros. Notar que un arreglo puede pensarse como
 * una funcion: en vez de a[i] puede ser a(i).
 * En las descripciones de las funciones: Si "t" es una instancia de
 * este tad, "t(x)" es la evalucion de la funcion representada por
 * este TAD en x. (Leer de nuevo si hace falta).
 */

typedef struct atable_s atable_s;

/*
 * Constructor. Devuelve NULL en caso de fallo.
 */
atable_s *atable_create (void);

/*
 * Redefine t de tal forma que 
 * (para todo x| x!=key ^ t(key) esta definido | t(key) no cambia) ^
 * t(key) = value
 * En caso de error devuelve un numero distinto de cero. En caso de
 * exito devuelve 0.
 */
int atable_insert (atable_s *t, void *key, size_t value);

/*
 * Devuelve el valor de t(key). Si t(key) no esta definido aborta.
 */
size_t atable_get (const atable_s *t, void *key);

/*
 * Devuelve un numero distinto de cero si t(key) esta definido, en
 * caso contrario devuelve 0.
 */
int atable_isdef (const atable_s *t,void *key);

/*
 * Indefine t(key). Si t(key) no estaba definido aborta.
 */
void atable_remove (atable_s *t,void *key);

/*
 * Destructor. Libera los recursos ocupados por t.
 */
void atable_destroy(atable_s *t);

#endif /* __ATABLE_H */
